package com.exam.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import com.exam.mapper.AdminMapper;
import com.exam.exception.AdminIsStopException;
import com.exam.exception.AdminNameIsExistException;
import com.exam.exception.AdminNoExistException;
import com.exam.exception.PasswordErrorException;
import com.exam.pojo.Admin;
import com.exam.pojo.Paging;
import com.exam.service.AdminService;
import com.exam.util.MD5Util;

/**
 * @author 郭荣锋
  *  管理员服务层
 */
@Service("adminServiceImpl")
public class AdminServiceImpl implements AdminService {
	
	@Resource(name="adminMapper")
	private AdminMapper adminMapper;
	@Resource(name="paging")
	private Paging<Admin> paging;
	@Autowired
	ApplicationContext ctx;
	
	/**
	  *  停用管理员
	 * @param 管理员名称
	 * @return 
	 */
	@Override
	public void stopAdmin(String adminName) {
		Admin admin = adminMapper.getAdminByName(adminName);
		admin.setState(0);
		adminMapper.updateAdmin(admin);
	}
	
	/**
	  *  启用管理员
	 * @param
	 * @return
	 */
	@Override
	public void startAdmin(String adminName) {
		Admin admin = adminMapper.getAdminByName(adminName);
		admin.setState(1);
		adminMapper.updateAdmin(admin);
	}

	/**
	 * 验证管理员身份
	 * @param adminName 管理员名
	 * @param password 密码
	 * @return
	 * @throws AdminNoExistException 管理员不存在异常
	 * @throws PasswordErrorException 密码错误异常
	 * @throws AdminIsStopException 管理员被停用异常 
	 */
	@Override
	public void validate(String adminName, String password) throws AdminNoExistException,
		AdminIsStopException,PasswordErrorException {

		//获取管理员对象
		Admin admin = adminMapper.getAdminByName(adminName);
		//判断管理员是否存在
		if(null == admin) { //管理员不存在
			throw new AdminNoExistException();
		}
		
		//判断密码是否正确
		if(!admin.getPassword().equals(MD5Util.toMd5(password))) {
			throw new PasswordErrorException();
		}
		
	}

	/**
	  *  获取所有管理员
	 * @param
	 * @return List<Admin> 管理员列表
	 */
	@Override
	public List<Admin> getAllAdmin() {
		return adminMapper.getAllAdmin();
	}

	/**
	  *  更新管理员信息
	 * @param admin 更新后的管理员对象
	 * @return void
	 * @throws 管理员名称已存在异常
	 */
	@Override
	public void updateAdmin(Admin admin) throws AdminNameIsExistException {
		Admin formerAdmin = adminMapper.getAdminById(admin.getId()); //原来的管理员对象
		//先判断更新的管理员的名称在表中是否重复(自己名称除外)
		if(null!=adminMapper.getAdminByName(admin.getAdminName()) && 
				!formerAdmin.getAdminName().equals(admin.getAdminName())) { //更新完的名字不是原来的名字
			throw new AdminNameIsExistException(); //名称已存在，抛出异常
		} else {
			if(!admin.getPassword().equals(formerAdmin.getPassword())) { //密码有改变,将密码转为MD5存入
				admin.setPassword(MD5Util.toMd5(admin.getPassword()));
			}
			adminMapper.updateAdmin(admin);
		}
	}

	/**
	 * 添加管理员
	 * @param admin 管理员对象
	 * @return void
	 * @throws  AdminNameIsExistException 管理员名已存在异常
	 */
	@Override
	public void addAdmin(Admin admin) throws AdminNameIsExistException {
		if(null != adminMapper.getAdminByName(admin.getAdminName())) { //该名称的管理员已经存在
			throw new AdminNameIsExistException();
		} else {
			adminMapper.addAdmin(admin);
		}
	}

	/**
	  *  通过管理员名字获取管理员对象
	 * @param adminName 管理员名字
	 * @return 管理员对象
	 */
	@Override
	public Admin getAdminByName(String adminName) {
		return adminMapper.getAdminByName(adminName);
	}
	
	/**
	 * 通过管理员编号获取管理员对象
	 * @param adminId 管理员编号
	 * @return 管理员对象
	 */
	@Override
	public Admin getAdminById(Integer adminId) {
		return adminMapper.getAdminById(adminId);
	}
	
	/**
	 * 以分页的形式获取管理员列表
	 * @param page 当前页面
	 * @param sizePage 页面大小
	 * @return 管理员列表
	 */
	@Override
	public Paging<Admin> getAdminByPaging(Integer page,Integer pageSize) {
		Map map = new HashMap();
		map.put("start",(page-1)*pageSize);
		map.put("offset", pageSize);
		paging.setCurrentPage(page);
		paging.setPageSize(pageSize);
		paging.setList(adminMapper.getAdminByPaging(map));
		paging.setTotalCount(adminMapper.getTotalCount());
		return paging;
	}
	
}
